//
//  ViewController.m
//  UI27_block
//
//  Created by dllo on 16/8/19.
//  Copyright © 2016年 yh. All rights reserved.
//

#import "ViewController.h"
#import "SecViewController.h"
@interface ViewController ()
// block属性
@property (nonatomic, copy) void (^block)();
// block写在方法中
- (void)handleData:(void(^)(void))handData;

@end

@implementation ViewController

- (void)handleData:(void (^)(void))data {
    [[NSURLSession sharedSession] dataTaskWithRequest:[NSMutableURLRequest new] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    }];

    
//[self handleData:^{
//    
//}];
    
//    self.block();
    
    // 类型修饰符
    //    __block 在ARC和MRC下有区别
    // 如果要在block中修改外界的值 要用__block修饰变量
    // ARC和MRC下都可以在block中修改外界变量
    // ARC下不能避免循环引用的问题
    int __block a = 100;
    // 或者 __block int a = 100;

    void (^blockTest) (void) = ^(void) {
        a = 100;
    };
    
    // __weak 强弱引用 修饰block外的变量
    // 只能在ARC下使用 (避免block的循环引用)
    // __strong
    
    
    
    
    
    
    
    
}
- (IBAction)push:(id)sender {
    SecViewController *sec = [[SecViewController alloc] init];
    [self.navigationController pushViewController:sec animated:YES];
    
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // Block 与函数相似 有固定功能的代码段
    // Block的基本语法
    // block 声明
    // 类型 void (^)(void)
    // 变量名 block
    // 声明block:     返回值类型 (^block名) (参数列表);
    void (^block)(void);
    // block 赋值     block变量 = ^(参数列表) {  固定的代码段  };
    block = ^(void) {
    
    };
    
    // block的几种形式
    // 有参有返回
    int (^block1)(int a, int b) = ^(int a, int b) {
        return a + b;
    };
    // 无参无返回 可以简化的去写
    void (^block2)(void) = ^(void) {
    
    };
    // 无参无返回最简的写法 (无参的 = 后的参数列表可以删掉)
    void (^oneBlock)() = ^{
        self.view.backgroundColor = [UIColor cyanColor];
    };
    
    // 有参无返回
    void (^block3)(int, int) = ^(int a, int b) {
    
    };
    // 无参有返回
    NSString * (^block4)(void) = ^(void) {
        return @"下雨啦";
    };
    
    NSString * (^block5)() = ^ {
        return @"下雨啦";
    };
    // 系统提供了代码段可以直接写一个block inlineBlock
//    <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
//        <#statements#>
//    };
    
    // block调用
    NSLog(@"%d",  block1(10, 20));
   
    oneBlock();
    
    // 系统中的block
    // 1. 模态 void (^ __nullable)(void))completion
    // 2. GCD void (^dispatch_block_t)(void);
    // 网络请求 void (^)(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
//    dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>)
    
    
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(back)];
    
    
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
